//给定两个字符串 s 和 t，判断它们是否是同构的。 
//
// 如果 s 中的字符可以按某种映射关系替换得到 t ，那么这两个字符串是同构的。 
//
// 每个出现的字符都应当映射到另一个字符，同时不改变字符的顺序。不同字符不能映射到同一个字符上，相同字符只能映射到同一个字符上，字符可以映射到自己本身。 
//
// 
//
// 示例 1: 
//
// 
//输入：s = "egg", t = "add"
//输出：true
// 
//
// 示例 2： 
//
// 
//输入：s = "foo", t = "bar"
//输出：false 
//
// 示例 3： 
//
// 
//输入：s = "paper", t = "title"
//输出：true 
//
// 
//
// 提示： 
//
// 
// 可以假设 s 和 t 长度相同。 
// 
// Related Topics 哈希表 字符串 
// 👍 401 👎 0

package com.cute.leetcode.editor.cn;

import java.util.HashMap;

public class IsomorphicStrings {
    public static void main(String[] args) {
        Solution solution = new IsomorphicStrings().new Solution();
    }
    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        /**
         * 1.判断两个字符串是否为同构字符串，可以假设两个字符串长度相等
         * 这个映射关系就很微妙，前字符映射到后字符与后字符映射到前字符可以不相等
         * 创建映射关系的时候我是这样想的：设后边的字符为t，前边的为s
         *      如果映射表不包含t：映射表如果value中已经包含了s直接返回false，不然的话以c为key s为value添加映射
         *      如果映射表包含t，检查对应的value是否与s相等，不等就返回false
         *
         * 2.另一种方法，将两个字符串按照一定的方式分别映射，比较映射后的结果是否相同，我觉得我的方法更简便一些，加了反向映射
         */
        public boolean isIsomorphic(String s, String t) {
            HashMap<Character, Character> map = new HashMap<>();
            char[] S = s.toCharArray();
            char[] C = t.toCharArray();
            for (int i = 0; i < s.length(); i++) {
               if(!map.containsKey(C[i])){//key中不包含c中的字符
                   if (map.containsValue(S[i])) return false;//但是包含了当前s中的字符，说明之前有映射关系了，返回false
                   map.put(C[i],S[i]);//没有包含s的映射关系，可以建立新的映射关系
               }else {
                   if (map.get(C[i])!=S[i]) return false;//检查映射关系是否一致，不一致就返回false
               }
            }
            return true;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}